// 创建用户相关的小仓库
import { reqLogin, reqUserInfo, reqLogout } from '@/api/user'
import { defineStore } from 'pinia'
// 引用操作本地存储的工具方法
import { SET_TOKEN, GET_TOKEN, REMOVE_TOKEN } from '@/utils/token'
import { ref, Ref } from 'vue'
import { ElNotification } from 'element-plus'
// 引入常量路由
import { constantRoute } from '@/router/routes'
import type { RouteRecordRaw } from 'vue-router'
// 引入用户的ts类型
import type {
  loginFormData,
  loginResponseData,
  userInfoResponseData,
} from '@/api/user/type'

// 创建用户小仓库
let useUserStore = defineStore('User', () => {
  // 相当于state状态
  let token = GET_TOKEN()
  // Ref是一个泛型接口，用户表示任何类型的引用
  let userId: Ref<number> = ref(0) // 提供一个初始值，确保类型匹配
  let username: Ref<string> = ref('') // 用户名
  let nickname: Ref<string> = ref('') // 昵称
  let email: Ref<string> = ref('') // 邮箱
  let avatar: Ref<string> = ref('') // 头像
  let is_superuser = ref<boolean>(false) // 是否为管理员
  let menuRoutes: RouteRecordRaw[] = constantRoute // 仓库存储菜单需要生成的路由
  // 定义登录函数(相当于actions)
  const userLogin = async (data: any) => {
    let res: any = await reqLogin(data)
    // 登录成功200=>返回token
    if (res.code === 200) {
      // console.log('登录成功')
      // pinia仓库存储token
      // token.value = res.data.token
      // console.log(token.value)
      SET_TOKEN(res.data.token)
      is_superuser.value = res.data.is_superuser
      // 能保证当前async函数返回的是一个成功的promise
      return 'ok'
    } else {
      ElNotification({
            type: 'error',
            message: res.error_msg,
          })
      return Promise.reject(res.error_msg)
    }
  }
  // 获取用户信息的方法
  const userInfo = async () => {
    //    获取用户信息进行存储仓库当中[用户头像、名字]
    let res: any = await reqUserInfo()
    if (res.code === 200) {
      userId.value = res.data.user_id
      username.value = res.data.username
      // console.log(res.result.nickname)
      nickname.value = res.data.nickname
      email.value = res.data.email
      // 使用JS中的字符串方法取最后一个，获得图片名称
      // avatar.value = res.result.avatar.split('/').pop()
      avatar.value = res.data.avatar_url
      return 'ok'
    } else {
      return Promise.reject(res.error_msg)
    }
  }
  // 退出登录
  const userLogout = async () => {
    let res: any = await reqLogout()
    if (res.code === 200) {
      token = ''
      username.value = ''
      avatar.value = ''
      REMOVE_TOKEN() // 清除token
      return 'ok'
    } else {
      return Promise.reject(new Error(res.error_msg))
    }
  }
  return {
    token,
    menuRoutes,
    userLogin,
    userInfo,
    userId,
    username,
    nickname,
    email,
    avatar,
    userLogout,
    is_superuser,
  }
})

export default useUserStore
